Fix dependent function setup for capture checking #16542
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #15925.
This issue is caused by a bug in
mapInferred
during CCSetup
. In this function we convert all top-level non-dependent functions to its dependent counterpart. However, it does not correctly handle the case when the type is an alias to function types. The problematic case in the pattern matching:It retrieves the argument and the result type of the function directly from the applied type arguments. This works for function classes. However, if the type here is a type alias to the function, e.g.
type Lazy[X] = Unit => X
, it is still recognized as a function (sincedefn.isNonRefinedFunction
does dealiasing) but it is incorrect to get the argument and result type of the function from the type parameter list here (which is justX :: Nil
).To fix this, we will dealias the type and recurse when it is an alias to the function type.